home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / cd-sup / amipeg / source / sutils.s < prev    next >
Text File  |  1999-01-01  |  6KB  |  376 lines

  1. ;
  2. ; Some practical assembler utility routines. See sutils.h for corresponding C prototypes
  3. ; They correspond to functions defined in util.c
  4. ;
  5. ; Michael Rausch  14-2-94  1:13:04
  6. ;
  7.  
  8.     SECTION    text,CODE
  9.  
  10. ER    EQU    -1
  11.  
  12. END_OF_BLOCK EQU 62
  13. ESCAPE    EQU    61
  14.  
  15. RUN_MASK EQU    $fc00
  16. RUN_SHIFT EQU    10
  17.  
  18. LEVEL_MASK EQU    $03f0
  19. LEVEL_SHIFT EQU    4
  20.  
  21. NUM_MASK EQU    $000f
  22.  
  23.  
  24.     XREF    @correct_underflow
  25.     XREF    _bitBuffer
  26.     XREF    _bufLength
  27.     XREF    _bitBuffer
  28.     XREF    _bitOffset
  29. ;    XREF    _bitCount    ; ANALYSIS
  30. ;    XREF    _mbCoeffPtr    ; ANALYSIS
  31.  
  32.     XREF    _dct_coeff_first
  33.     XREF    _dct_coeff_next
  34.     XREF    _dct_coeff_tbl_0
  35.     XREF    _dct_coeff_tbl_1
  36.     XREF    _dct_coeff_tbl_2
  37.     XREF    _dct_coeff_tbl_3
  38.  
  39.     XREF    _zigzag_direct
  40.  
  41.  
  42. ; ***************************************************************
  43.  
  44. ; Fills in the data if a new quantization matrix is encountered in the stream.
  45. ; In addition, it creates the qscale multiplication tables.
  46.  
  47.     XDEF    @new_matrix
  48. @new_matrix:
  49.     movem.l    d2-d4/a2-a3,-(sp)
  50.     move.l    a0,a2
  51.  
  52.     moveq    #16,d1
  53.     cmp.l    _bufLength(a4),d1
  54.     ble.s    nm_nc
  55.     bsr    @correct_underflow
  56. nm_nc:
  57.  
  58.     move.l    a2,a1
  59.  
  60.     move.l    _bitOffset(a4),d1
  61.     move.l    _bitBuffer(a4),a0
  62.  
  63.     moveq    #8,d3
  64.     moveq    #32,d2
  65.  
  66.     moveq    #63,d4
  67. get64bytesfromstream:
  68.  
  69.     bfextu    (a0){d1:d3},d0
  70.     move.w    d0,(a1)+        ; was indexed via zigzag_direct, but changed in utilisation as well
  71.  
  72.     add.l    d3,d1
  73.     cmp.l    d2,d1
  74.     blt.s    nmxw
  75.     sub.l    d2,d1
  76.     addq.l    #4,a0
  77.     subq.l    #1,_bufLength(a4)
  78. nmxw:
  79.     dbra    d4,get64bytesfromstream
  80.  
  81. ;    add.l    #64*8,_bitCount(a4)    ; ANALYSIS
  82.     move.l    a0,_bitBuffer(a4)
  83.     move.l    d1,_bitOffset(a4)
  84.  
  85.  
  86.     move.l    a2,a3            ; last scale
  87.     moveq    #29,d0
  88. allqscales:
  89.     move.l    a2,a0            ; first scale
  90.     moveq    #15,d1
  91. qscaletab:
  92.     rept 2
  93.     move.l    (a0)+,d2        ; get first qscale
  94.     add.l    (a3)+,d2        ; add last qscale
  95.     move.l    d2,(a1)+        ; is new qscale    
  96.     endr
  97.     dbra    d1,qscaletab
  98.     dbra    d0,allqscales
  99.  
  100.  
  101.     movem.l    (sp)+,d2-d4/a2-a3
  102.     rts
  103.  
  104.  
  105. ; ***************************************************************
  106.  
  107. process_intra MACRO (label, sparereg)
  108.  
  109.     bfextu    (a1){d7:d6},d0
  110.  
  111.     move.l    d0,d1
  112.     rol.l    #8,d1            ; only .b-tests are valid!
  113.  
  114.     cmp.b    #3,d1
  115.     bls    .adcd_others
  116.  
  117.     and.w    #$ff,d1
  118.     moveq    #0,d5
  119.     move.w    (a2,d1.w*2),d5        ; value
  120.  
  121.     move.l    d5,d3
  122.     lsr.w    #RUN_SHIFT-8,d3        ; run
  123.     lsr.w    #8,d3
  124.     cmp.w    #END_OF_BLOCK,d3
  125.     beq    \1            ; reci_ready
  126.     cmp.w    #ESCAPE,d3
  127.     beq.s    .aescape
  128.  
  129. .astd_handle:
  130.  
  131.     move.w    d5,d4            ; flushed
  132.     and.w    #NUM_MASK,d4
  133.     addq.w    #2,d4
  134.  
  135.     and.w    #LEVEL_MASK,d5
  136.     lsr.w    #LEVEL_SHIFT,d5        ; level
  137.  
  138.     moveq.l    #32,d1
  139.     sub.w    d4,d1
  140.     btst    d1,d0
  141.     beq    .aoutblockescape
  142.     neg.l    d5
  143.     bra    .aoutblockescape        ; fertig
  144. .aescape:
  145.  
  146.     move.w    d5,d4            ; flushed
  147.     and.w    #NUM_MASK,d4
  148.     add.w    #1+22,d4
  149.  
  150.     moveq    #18+22-8,d1
  151.     sub.w    d4,d1
  152.     move.l    d0,d3
  153.     lsr.l    d1,d3            ; temp
  154.  
  155.     move.w    d3,d5            ; ?!??
  156.     lsr.l    #8,d3
  157.  
  158.     and.w    #$3fff,d3        ; run/level
  159.  
  160.     tst.b    d3
  161.     beq.s    .aoutblockescape3
  162.  
  163.     cmp.b    #128,d3
  164.     beq.s    .ais128
  165.     move.b    d3,d5
  166.     subq.w    #8,d4
  167.     bra.s    .aoutblockescape3
  168.  
  169. .ais128:
  170.     sub.w    #256,d5
  171.     ext.l    d5
  172.     bra.s    .aoutblockescape2
  173.  
  174. .adcd_others:
  175.     beq.s    .adc3            ; cmp #3 from above
  176.     tst.b    d1
  177.     bne.s    .adc1
  178.     moveq    #16,d1
  179.     move.l    #255,d3
  180.     lea    _dct_coeff_tbl_0(a4),\2
  181.     bra.s    .adcdo_gotval
  182. .adc1:    subq.b    #1,d1
  183.     bne.s    .adc2
  184.     moveq    #20,d1
  185.     moveq    #15,d3
  186.     lea    _dct_coeff_tbl_1(a4),\2
  187.     bra.s    .adcdo_gotval
  188. .adc2:    lea    _dct_coeff_tbl_2(a4),\2
  189.     bra.s    .adc32
  190. .adc3:    lea    _dct_coeff_tbl_3(a4),\2
  191. .adc32:    moveq    #22,d1
  192.     moveq    #3,d3
  193.  
  194. .adcdo_gotval:
  195.     move.l    d0,d5
  196.     lsr.l    d1,d5
  197.     and.l    d3,d5
  198.     move.w    (\2,d5.w*2),d5    ; value
  199.  
  200.     move.l    d5,d3
  201.     lsr.w    #RUN_SHIFT-8,d3    ; run
  202.     lsr.w    #8,d3
  203.  
  204.     bra    .astd_handle
  205.  
  206.  
  207. .aoutblockescape3:
  208.     extb.l    d5
  209. .aoutblockescape2:
  210.     lsr.w    #8,d3
  211. .aoutblockescape:
  212.  
  213. ;    ext.l    d4
  214. ;    add.l    d4,_bitCount(a4)    ; ANALYSIS
  215.     add.w    d4,d7
  216.     cmp.l    d6,d7
  217.     blt.s    .adcds    ;endofblock
  218.     sub.l    d6,d7
  219.     addq.l    #4,a1
  220.     subq.l    #1,_bufLength(a4)
  221. .adcds:            ;endofblock:
  222.     endm
  223.  
  224. ; *******************
  225.  
  226.  
  227.     XDEF    _recon_nonintra
  228. _recon_nonintra:
  229. ri_regs REG    d2-d7/a2-a3/a5-a6
  230.     movem.l    ri_regs,-(sp)
  231.  
  232.     swap    d0
  233.     move.l    d0,-(sp)            ; qscale
  234.     move.l    a1,a6
  235.  
  236.     lea    _zigzag_direct(a4),a3
  237.     lsl.l    #2,d1                ; i, index to zigzag
  238.     add.l    d1,a3
  239.  
  240.     lea    _dct_coeff_next(a4),a2
  241.  
  242.     move.l    _bitBuffer(a4),a1
  243.     move.l    _bitOffset(a4),d7
  244.     moveq    #32,d6
  245.  
  246. rneci_loop1:
  247.     process_intra    rneci_ready,a0
  248.  
  249.     addq.l    #1,d3
  250. ;    add.l    d3,d3
  251. ;    add.l    d3,d3
  252.     lsl.l    #2,d3
  253.     add.l    d3,a3                ; i+= run+1  (implicit zigzag)
  254.     move.l    (a3),d1                ; pos
  255.     muls.w    (sp),d5                ; qscale
  256.     asr.w    #3,d5
  257.     move.w    d5,(a6,d1.l*2)
  258.     bra    rneci_loop1
  259.  
  260. rneci_ready:
  261.     addq.l    #2,d7
  262.     cmp.l    d6,d7
  263.     blt.s    rneci_flush
  264.     sub.l    d6,d7
  265.     subq.l    #1,_bufLength(a4)
  266.     addq.l    #4,a1
  267. rneci_flush:
  268.     move.l    a1,_bitBuffer(a4)
  269.     move.l     d7,_bitOffset(a4)
  270.  
  271. ; this won't work anymore ... take a3 instead!
  272. ;     addq.l    #1,([_mbCoeffPtr,a4],d1.l*4)    ; ANALYSIS
  273.  
  274.     addq.l    #4,sp
  275.  
  276.     move.l    a6,a0
  277.     bra    jrevdct
  278.  
  279.  
  280.  
  281. ; ***********************
  282.  
  283.     XDEF    @recon_non2intra
  284. @recon_non2intra:
  285.     movem.l    ri_regs,-(sp)
  286.     move.l    a0,a5
  287.  
  288.     lea    _zigzag_direct(a4),a3
  289.     add.l    d0,d0
  290.     add.l    d0,a5
  291.     add.l    d0,d0
  292.     add.l    d0,a3                ; i+= run
  293.  
  294.     bra    r2ni_entry
  295.  
  296.     XDEF    @recon_intra
  297. @recon_intra:
  298.     movem.l    ri_regs,-(sp)
  299.     move.l    a0,a5
  300.  
  301.     lea    _zigzag_direct(a4),a3
  302.  
  303. r2ni_entry:
  304.     move.l    a1,a6
  305.     lea    _dct_coeff_next(a4),a2
  306.  
  307.     move.l    _bitBuffer(a4),a1
  308.     move.l    _bitOffset(a4),d7
  309.     moveq    #32,d6
  310.  
  311. reci_loop1:
  312.     process_intra    reci_ready,a0
  313.  
  314.     addq.l    #1,d3
  315.     add.l    d3,d3
  316.     add.l    d3,a5
  317.     add.l    d3,d3
  318.     add.l    d3,a3                ; i+= run+1  (implicit zigzag)
  319.     move.l    (a3),d1                ; pos
  320.     muls.w    (a5),d5
  321.     asr.w    #3,d5
  322. ; das vorzeichen von (a5) wird benutzt, um d5 mittels lsb auf/abrunden
  323. ; ...
  324.     move.w    d5,(a6,d1.l*2)
  325.     bra    reci_loop1
  326.  
  327. reci_ready:
  328.     addq.l    #2,d7
  329.     cmp.l    d6,d7
  330.     blt.s    reci_flush
  331.     sub.l    d6,d7
  332.     subq.l    #1,_bufLength(a4)
  333.     addq.l    #4,a1
  334. reci_flush:
  335.     move.l    a1,_bitBuffer(a4)
  336.     move.l     d7,_bitOffset(a4)
  337.  
  338.  
  339. ; this won't work anymore ... reference a3 instead!
  340. ;     addq.l    #1,([_mbCoeffPtr,a4],d1.l*4)    ; ANALYSIS
  341.  
  342.     move.l    a6,a0
  343. ;    bra    jrevdct
  344.  
  345.     include    "sjrevdct.s"
  346.  
  347. ; ***************************************************************
  348.  
  349.     XDEF    _s_DecodeDCTCoeff
  350. _s_DecodeDCTCoeff:
  351. dcdregs    REG    d2-d7
  352.     movem.l    dcdregs,-(sp)
  353.  
  354.     move.l    _bitBuffer(a4),a1
  355.     move.l    _bitOffset(a4),d7
  356.     moveq    #32,d6
  357.  
  358.     process_intra    endofblock,a2
  359.  
  360.     move.l    a1,_bitBuffer(a4)
  361.     move.l     d7,_bitOffset(a4)
  362.  
  363.     move.l    d5,(a0)        ; int *level
  364.  
  365. endofblock:
  366.     move.w    d3,d0        ; run = return value!
  367.     ext.l    d0
  368.  
  369.     movem.l    (sp)+,dcdregs
  370.     rts
  371.  
  372.  
  373. ; ***************************************************************
  374.  
  375.     END
  376.